const async = require('async');

console.time('test');

//一、串行无关联
//整个运行时间是各个运行时间的总和
//标准的串行流程,代码可读性很强, 容易维护,但是这种流程只适合按顺序执行且每一步没有关联
//适用场景:提取某学校大三学生的学生信息(假设每个班级存储在一个独立的数据表里)
// 分析:每个班级的学生之间是无关联的,假设共有3个班级,我们需要遍历3个表,把提取出的学生信息返回客户端一个json,如下
// {
//     "1班":[{name:"张三",age:"21",class:"1班"},......(省略N个学生)]
//     "2班":[{name:"李四",age:"22",class:"2班"},......(省略N个学生)]
//     "3班":[{name:"王五",age:"22",class:"3班"},......(省略N个学生)]
// }

// [ 'one', 'two' ]
// test: 7007.029ms
//第1种用法
// async.series([
//     function(callback){
//         setTimeout(function () {
//             callback(null,'one');
//         },2000);
//     },
//     function(callback){
//         setTimeout(function () {
//             callback(null,'two');
//         },5000);
//     }
// ],function (error,results) {
//     console.log(results);
//
//     console.timeEnd('test');
// })

// { one: '1', two: '2' }
// test: 3028.201ms
//第2种用法
// async.series({
//     one: function (callback) {
//         setTimeout(function () {
//             callback(null,'1');
//         },1000)
//     },
//     two: function (callback) {
//         setTimeout(function () {
//             callback(null,'2');
//         },2000)
//     }
// },function (error,results) {
//     console.log(results);;
//     console.timeEnd('test');
// })

//二、并行无关联
//并行无关联是请求时间最长的那个
//同时并行处理每一个流程,最后汇总结果,如果某一个流程出错就退出
//适用场景：串行无关联的场景在不需要考虑顺序的情况下适用二

//{ function: 'two' }
// test: 5009.881ms
// async.parallel({
//     function(callback){
//         setTimeout(function () {
//             callback(null, 'one');
//         }, 2000);
//     },
//     function(callback){
//         setTimeout(function () {
//             callback(null, 'two');
//         }, 5000);
//     }
// }, function (error, results) {
//     console.log(results);
//     console.timeEnd('test');
// })

//三、串行有关联
//调用 waterfall 函数时传入一个数组,数组总的每一个元素就是一个串行控制节点,每一个节点执行必须保证上一节点已经执行完成且拿到结果.这样将结果传入下一个控制节点作为参数来运行
//适用场景:打开微博首页需要加载 微博个人信息,微博分组信息,微博分组粉丝信息 这里不考虑ajax 异步拉取每个模块.如果我们用ejs来渲染,需要发送给前端页面一个这样的数据结构(简单的模拟数据)
// {
//     userInfo:{userID:10001,totalNum:368,fans:562,follow:369}
//     group:[{groupID:100,groupName:"粉丝"},{groupID:200,groupName:"同事"}...],
//         fansGroup:{"粉丝":[{nickName:'aa',age:20},{nickName:'bb',age:22}....]}
// }

//[ 'one', 'two', 'three', 'done' ]
async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arr1, arr2, callback){
        callback(null, arr1, arr2, 'three');
    },
    function(arr1,arr2,arr3,callback){
        callback(null,[arr1,arr2,arr3,'done'])
    }
],function (error,results) {
    console.log(results);
})

